#include <curses.h>
#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
#include <libgen.h>
#include <arpa/inet.h>
#include "client.h"
#include "can.h"

int main(int argc, char **argv)
{
   sockfd=0;
   can_t can1;     // CAN-Nachricht 1
   can_t can2;     // CAN-Nachricht 2
   can_t canrec;   // Empfangene CAN-Nachricht / Statusmeldung
   int i,key,status;
   struct timeval timeout;
   fd_set set;

   if (argc<3)
   {
      printf("Usage: %s <hostname or IP> <port>\n",basename(argv[0]));
      return 1;
   }
   if ( client_connect(argv[1], atoi(argv[2])) !=0)
   {
      printf("Kann keine Verbindung zum CAN-Server aufbauen\n");
      return 1;
   }
   sockfd=get_sockfd();
  
   // CAN-Objekt fuer Nachricht 1
   can1.msgtype='M';     // Normale Message
   can1.format='S';      // Standard-Format
   can1.id=htonl(0x555); // Identifier
   can1.num=8;           // 8 Datenbytes
   for (i=0; i<8; i++)
   {
      can1.data[i]=0x11*i;
   }

   // CAN-Objekt fuer Nachricht 2
   can2.msgtype='M';     // Normale Message
   can2.format='S';      // Standard-Format
   can2.id=htonl(0x123); // Identifier
   can2.num=4;           // 4 Datenbytes
   can2.data[0]=0xc0;
   can2.data[1]=0xca;
   can2.data[2]=0xc0;
   can2.data[3]=0x1a;
   can2.data[4]=0; can2.data[5]=0; can2.data[6]=0; can2.data[7]=0;
   
   initscr(); cbreak();
   nodelay(stdscr,TRUE);
   noecho();

   refresh();
   printf("[1]   CAN Message senden: ID=555 [11] [22] [33] [44] [55] [66] [77] [88]\n\r");
   printf("[2]   CAN Message senden: ID=123 [c0] [ca] [c0] [1a]\n\r");
   printf("[ESC] Ende\n\r\n\r");
   refresh();

   do
   {
     key=getch();
     if (key=='1') { write(sockfd,&can1,sizeof(can_t)); }
     if (key=='2') { write(sockfd,&can2,sizeof(can_t)); }
     FD_ZERO(&set);
     FD_SET(sockfd, &set);
     timeout.tv_sec=0;
     timeout.tv_usec=10000;
     status=select(FD_SETSIZE,&set,NULL,NULL,&timeout);
     if (status<=0)
     {
	//printf("TCP timeout\n");
     }
     else
     {
        // Empfange CAN-Nachricht bzw. Statusmeldung vom CAN-Server
        status=read(sockfd,&canrec,sizeof(can_t));
        // Gelesenes Paket muss die Groesse der CAN-Struktur haben
        if (status!=sizeof(can_t))
        {
           endwin();
           printf("Falsche Datenlaenge empfangen\n\r");
           return 0;
        }
        else
        {
           if (canrec.msgtype=='S')
           {
              printf("Statusmeldung: Code=%i\n\r",ntohl(canrec.id));
           }
           else
           {
              printf("CAN-Nachricht: "); can_dump(&canrec);
              printf("\r");
           }
        }
        refresh();
     }
   // solange, bis ESC gedruckt
   } while (key!=27);
   endwin();

   return 0;
}
